/*
 * @Author: hrg
 * @Date: 2023-05-19 10:02:04
 * @LastEditTime: 2023-05-19 17:21:04
 * @FilePath: \study_go\go_gin\demo\main.go
 * @Description:
 */
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	// 1、创建路由：
	r := gin.Default()
	// 2.绑定路由规则，执行的函数
	// gin.Context，封装了request和response
	r.GET("/hrg", func(c *gin.Context) {
		// c.String(http.StatusOK, "哈哈哈哈，离离原上铺")
		c.JSON(200, gin.H{
			"hhhh": "fghjkl",
		})
	})

	// RESTful api：
	/*
		// 	GET：用来获取资源
		r.GET("/get_book", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"method": "GET",
			})
		})
		// POST：用来新建资源
		r.POST("/post_book", func(ctx *gin.Context) {
			ctx.JSON(200, gin.H{
				"method": "POST",
			})
		})
		// PUT：用来更新资源
		r.PUT("/put_user", func(ctx *gin.Context) {
			ctx.JSON(200, gin.H{
				"method": "put",
			})
		})
		// DELETE:用来删除资源
		r.DELETE("/delete_book", func(ctx *gin.Context) {
			ctx.JSON(200, gin.H{
				"method": "DELETE",
			})
		})
	*/
	// 3、监听端口 默认在8080

	// 用于加载页面
	// 渲染页面之前需要加载静态资源文件：(加载页面+加载css，js等)
	//  用于加载html页面的。通过该函数r.LoadHTMLFiles("../html/index.html")或者	r.LoadHTMLGlob("../html/page/*")函数。
	r.LoadHTMLGlob("../html/page/*")
	// 用于加载静态资源的，例如css，js等
	r.Static("../html/static", "../html/static")

	// HTML渲染：
	r.GET("/posts/index", func(ctx *gin.Context) {
		// ctx.HTML()参数：参数1：状态码，参数2：页面名称。参数3：传递的数据
		ctx.HTML(http.StatusOK, "index.html", gin.H{
			"msg": "获取成功",
		})
	})

	// 获取请求参数：
	r.GET("/user/info", func(ctx *gin.Context) {
		userid := ctx.Query("userid")
		pd := ctx.Query("password")
		ctx.JSON(200, gin.H{
			"用户id": userid,
			"密码":   pd,
		})
	})

	r.POST("/posts/user/add", func(ctx *gin.Context) {
		uname := ctx.PostForm("username")
		pad := ctx.PostForm("password")
		ctx.JSON(http.StatusOK, gin.H{
			"用户名": uname,
			"密码":  pad,
		})
	})

	// 路由：
	r.GET("test", func(ctx *gin.Context) {
		// 路由重定向
		ctx.Redirect(307, "https:www.baidu.com")
	})
	// 404页面
	r.NoRoute(func(ctx *gin.Context) {
		ctx.HTML(http.StatusNotFound, "404.html", nil)
	})

	// 路由组：
	userGroup := r.Group("/user")
	{
		userGroup.GET("/add")
		userGroup.GET("/login")
		userGroup.GET("/layout", func(ctx *gin.Context) {
			ctx.JSON(200, gin.H{
				"msg": "注销成功",
			})
		})
	}

	// 服务器端口
	r.Run(":8080")
}

// 自定义go中间件 （拦截器），登录验证等等
func mytool() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		// 设置参数
		ctx.Set("token", "wertyuiasdfadsdfafas")
		ctx.Next()
		ctx.Abort()
	}
}
